package com.example.collection;

import com.example.entity.Person;
import org.junit.Test;

import java.util.*;

/**
 * @author readpage
 * @create 2022-09-14 21:27
 *
 * 一、集合框架的概述
 *
 * 1.集合、数组都是对多个数据进行存储操作的结构，简称Java容器
 *  说明: 此时的存储，主要指的是内存层面的存储，不涉及到持久化的存储(.txt,.jpg,.avi,数据库中)
 *
 * 2.1数组在存储多个数据方面的特点:
 *      > 一旦初始化以后，其长度就确定了。
 *      > 数组一旦定义好,其元素的类型也就确定了。就只能操作指定类型的数据了。比如: String[] arr; int[] arr1;
 *      > 比如: String[] arr; int[] arr1; Object[] arr2;
 * 2.2数组在存储多个数据方面的缺点:
 *      > 一旦初始化以后，其长度就不可修改。
 *      > 数组中提供的方法非常有限，对于添加、删除、插入数据等操作，非常不便
 *      > 获取数组中实际元素的个数的需求，数组没有现成的属性或方法可用
 *      > 数组存储数据的特点: 有序、可重复。对于无序、不可重复的需求，不能满足。
 *
 *二、集合框架
 *  |-----Collection接口: 单列集和，用来存储一个一个的对象
 *      |-----list接口: 存储有序的、可重复的数据。  --> "动态"数组
 *          |----ArrayList、LinkedList、Vector
 *      |-----set接口: 存储无序的、不可重复的数据
 *          |----HashSet、LinkedHashSet、TreeSet
 *  |-----Map接口: 双列集合，用来存储一对(key - value)一对的数据
 *          |----HashMap、LinkedHashMap、TreeMap、Hashtable、Properties
 *三、Collection接口中的方法
 *  向Collection接口的实现类的对象中添加数据obj时，要求obj所在类要重写equals().
 */
public class CollectionTest {

    @Test
    public void test() {
        Collection coll = new ArrayList();
        //add(Object e):将元素e添加到集合coll中
        coll.add("AA");
        coll.add("BB");
        coll.add(123); //自动装箱
        coll.add(new Date());

        //size():获取添加的元素的个数
        System.out.println(coll.size());  //4

        //addAll():
        ArrayList<Object> coll2 = new ArrayList<>();
        coll2.add(456);
        coll2.add("CC");
        coll.addAll(coll2);

        System.out.println(coll.size()); //6
        System.out.println(coll);

        //clear():清空集和元素
        coll.clear();

        //isEmpty():
        System.out.println(coll.isEmpty());
    }

    @Test
    public void test2() {
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));
        coll.add(false);
        coll.add(new Person("Jerry", 20));

        //contains(Object obj):判断当前集合是否包含obj
        //判断时会调用obj对象所在类的equals()。
        boolean contains = coll.contains(123);
        System.out.println(contains);
        System.out.println(coll.contains(new String("Tom")));
        System.out.println(coll.contains(new Person("Jerry", 20))); //false --> true

        System.out.println("------------------");
        //containsAll(Collection coll):判断形参coll中所有的元素是否存在于当前的集合中。
        Collection coll2 = Arrays.asList(123, 456);
        System.out.println(coll.containsAll(coll2));
    }

    @Test
    public void test3() {
        // remove
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));
        coll.add(false);
        coll.add(new Person("Jerry", 20));

        coll.remove(1234);
        System.out.println(coll);

        coll.remove(new Person("Jerry", 20));
        System.out.println(coll);

        // removeAll(Collection cool):从当前集合中移除coll中所有的元素
        Collection coll2 = Arrays.asList(123, 4567);
        coll.removeAll(coll2);
        System.out.println(coll );
    }

    @Test
    public void test4() {
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));
        coll.add(false);
        coll.add(new Person("Jerry", 20));

        //retainAll(Collection coll):交集:获取当前集合coll集合的交集，放回给当前集合
//        Collection coll2 = Arrays.asList(123, 456, 789);
//        coll.retainAll(coll2);
//        System.out.println(coll);

        //equals(Object obj):
        Collection coll2 = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));
        coll.add(false);
        coll.add(new Person("Jerry", 20));

        System.out.println(coll.equals(coll2));
    }

    @Test
    public void test5() {
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));
        coll.add(false);
        coll.add(new Person("Jerry", 20));
        // 集合转换为数组
        Object[] arr = coll.toArray();
        System.out.println(Arrays.toString(arr));
        
        //扩展: 数组 -> 集合
        List<String> list = Arrays.asList("AA", "BB", "CC");
        System.out.println(list);

        List<Integer> list2 = Arrays.asList(123, 456);
        System.out.println(list2);

    }
    
}
